package com.xb.loan.cashier.biz.pay.alipay;


import com.xb.loan.cashier.biz.pay.PaymentForCharge;
import com.xb.loan.cashier.biz.pay.alipay.config.AlipayConfig;
import com.xb.loan.cashier.biz.pay.alipay.util.AlipaySubmit;
import com.xb.loan.cashier.biz.pay.bean.PaymentChargeOrder;

import java.util.HashMap;
import java.util.Map;

/**
 * 支付宝支付（仅充值）
 * 将支付宝支付中的充值单独提出做成工厂方便扩展和调用
 */
public class AlipayPaymentForCharge extends PaymentForCharge {
	
	//支付宝模块(接口)常量
	public final static String MODULE_WAP_DIRECT_PAY = "alipay.wap.create.direct.pay.by.user";//wap支付
    public final static String MODULE_WEB_DIRECT_PAY = "create_direct_pay_by_user";//web支付
    public final static String MODULE_APP_DIRECT_PAY = "mobile.securitypay.pay";//app支付
	
	/**
     * 通过手机网页进行充值，提交到第三方的充值订单信息（获取wap支付链接）
     * 
     * @param paymentChargeOrder 充值信息
     * @return 跳转网关的url串
     * @throws Exception
     */
    @Override
	public String chargeByWap(PaymentChargeOrder paymentChargeOrder)
			throws Exception {
    	// 合作者身份ID
    	String partner = paymentChargeOrder.getChannelUser();
    	// 商户网站唯一订单号
    	String orderId = paymentChargeOrder.getOrderId();
    	// 商品名称
    	String subject = paymentChargeOrder.getTitle();
    	// 交易金额
    	String money = String.valueOf(paymentChargeOrder.getMoney());
    	// 服务器异步通知页面路径
    	String notifyUrl = paymentChargeOrder.getNotifyUrl();
    	// 页面跳转同步通知页面路径
    	String returnUrl = paymentChargeOrder.getCallBackUrl();
    	// 签名方式
    	String signType = paymentChargeOrder.getSignType();
    	// 加密key
    	String signKey = paymentChargeOrder.getSignKey();
    	// 支付地址
    	String payUrl = paymentChargeOrder.getPayUrl();
    	// 商品描述
    	String body = paymentChargeOrder.getDetail();
    	
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", MODULE_WAP_DIRECT_PAY);
        sParaTemp.put("partner", partner);
        sParaTemp.put("seller_id", partner);
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        sParaTemp.put("payment_type", "1");//支付类型。仅支持：1（商品购买）。
        sParaTemp.put("notify_url", notifyUrl);
        sParaTemp.put("return_url", returnUrl);
        sParaTemp.put("out_trade_no", orderId);
        sParaTemp.put("subject", subject);
        sParaTemp.put("total_fee", money);
        sParaTemp.put("body", body);
        return AlipaySubmit.buildRequest(sParaTemp,signType,signKey,payUrl);
    }
    
    /**
     * 通过网页（电脑网页）进行充值，提交到第三方的充值订单信息(获取web支付链接)
     * 
     * @param paymentChargeOrder 充值信息
     * @return 跳转网关的url串
     * @throws Exception
     */
    @Override
	public String chargeByWeb(PaymentChargeOrder paymentChargeOrder)
			throws Exception {
    	// 合作者身份ID
    	String partner = paymentChargeOrder.getChannelUser();
    	// 商户网站唯一订单号
    	String orderId = paymentChargeOrder.getOrderId();
    	// 商品名称
    	String subject = paymentChargeOrder.getTitle();
    	// 交易金额
    	String money = String.valueOf(paymentChargeOrder.getMoney());
    	// 服务器异步通知页面路径
    	String notifyUrl = paymentChargeOrder.getNotifyUrl();
    	// 页面跳转同步通知页面路径
    	String returnUrl = paymentChargeOrder.getCallBackUrl();
    	// 签名方式
    	String signType = paymentChargeOrder.getSignType();
    	// 加密key
    	String signKey = paymentChargeOrder.getSignKey();
    	// 支付地址
    	String payUrl = paymentChargeOrder.getPayUrl();
    	// 商品描述
    	String body = paymentChargeOrder.getDetail();
    	
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", MODULE_WEB_DIRECT_PAY);
        sParaTemp.put("partner", partner);
        sParaTemp.put("seller_id", partner);
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        sParaTemp.put("payment_type", "1");//支付类型。仅支持：1（商品购买）。
        sParaTemp.put("notify_url", notifyUrl);
        sParaTemp.put("return_url", returnUrl);
        sParaTemp.put("out_trade_no", orderId);
        sParaTemp.put("subject", subject);
        sParaTemp.put("total_fee", money);
        sParaTemp.put("body", body);
        return AlipaySubmit.buildRequest(sParaTemp,signType,signKey,payUrl);
    }

    /**
	 * 通过手机App进行充值，提交到第三方的充值订单信息（支付宝暂时没有手机App支付？）
	 * 
	 * @param paymentChargeOrder 充值信息
	 * @return 跳转网关的url串
	 * @throws Exception
	 */
	@Override
	public String chargeByApp(PaymentChargeOrder paymentChargeOrder) throws Exception {
	    
	       // 签名方式
        String signType = paymentChargeOrder.getSignType();
        // 加密key
        String signKey = paymentChargeOrder.getSignKey();
	    
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("service", MODULE_APP_DIRECT_PAY);
        //商户号
        sParaTemp.put("partner", paymentChargeOrder.getChannelUser());
        sParaTemp.put("seller_id", paymentChargeOrder.getChannelUser());
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        //支付类型。仅支持：1（商品购买）
        sParaTemp.put("payment_type", "1");
        //后台回调地址
        sParaTemp.put("notify_url", paymentChargeOrder.getNotifyUrl());
        //前台回调地址
        sParaTemp.put("return_url", paymentChargeOrder.getCallBackUrl());
        //订单号
        sParaTemp.put("out_trade_no", paymentChargeOrder.getOrderId());
        //商品标题
        sParaTemp.put("subject", paymentChargeOrder.getTitle());
        //商品描述
        sParaTemp.put("body", paymentChargeOrder.getDetail());
        //交易金额
        sParaTemp.put("total_fee", String.valueOf(paymentChargeOrder.getMoney()));
        
        String payStr = AlipaySubmit.buildRequest(sParaTemp, signType, signKey, "");
        
        //请求地址,去掉请求地址前面的?号
        return payStr.substring(1);
	}
}
